#include <iostream>

#include <regex.h>

#include "httplib.h"

void Hello(const httplib::Request  &req,httplib::Response &rsp){
    rsp.set_content("Hello world","text/plain"); // 设置响应正文 其中数据类型为正文类型 "text/plain"
    rsp.status = 200;   // 设置状态码为 200
}

void Numbers(const httplib::Request &req, httplib::Response &rsp){
    auto num = req.matches[1]; // 位置[0]中保存的是整体path,往后的下标中保存的都是捕捉的数据
    rsp.set_content(num,"text/plain"); // 此处 num 获取上来仍为一个字符串 并未进行类型转移 因此直接以文本类型输出即可
    rsp.status = 200;
}


void Multipart(const httplib::Request &req, httplib::Response &rsp){
    // 来打酱油的 混个眼熟 在客户端中再配
    auto ret = req.has_file("file"); // 判断传入的请求中是否传有名为 "file" 的文件
    if(ret == false) {
        // 表示不是文件上传
        std::cout<<"not file upload\n";
        rsp.status = 400;
        return ;
    }
    const auto &file = req.get_file_value("file"); // 获取文件区域数据信息
    rsp.body.clear();
    rsp.body = file.filename;   // 文件名称
    rsp.body += "\n";
    rsp.body += file.content;   // 文件内容
    rsp.set_header("Content-Type", "text/plain"); // 设置头部字段
    rsp.status = 200; // 设置状态码
    return ;

}


int main(){

    // std::cout<<"hello world"<<std::endl;
    
    httplib::Server server; // 实例化一个Server对象
    server.Get("/hi",Hello); // 注册一个针对"hi"的GET请求的处理函数映射关系
   
    // server.Get(R"(/number/(\d+))",Numbers); // 这两行内容大致相同 其中采用 R 来去除字符串中特殊含义 如转义字符 
    server.Get("/number/(\\d+)",Numbers); // vimplus 中的报错可以不用卵
                                          // ()用来捕捉数据
                                          // 这里是注册一个针对"/number/[具体数字]"的GET请求的处理函数映射关系
                                          // \d 是正则表达式 表示[0-9]的字符 
                                          // + 表示子表达式一次或多次 (>=1) 
    
   server.Post("/multipart",Multipart);
    
    server.listen("0.0.0.0",8121); // 创建并使用服务器

    return 0;
}
